@L|}6CD l0C)HCC WhL/h `CmCDiD`  R@W1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )} `A! d߰")-݆ "  $G@LLL&0") $G% }H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0 })8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH) }  hyhyB q L> Lm JJ  Ln*` dB%' }8  H H` 1 { LL   !L     Hh SY?  q  1L }  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}} HE |||DDOS DOSDOS SYS }}}}CDOS SYS} 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU  } L ? .  t`GBJ V~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI   0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -'}LLu DEHILV 9 .l 9 .l  `` s$B VBH(}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL)}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e*}1i1232435ޥ<<8} 3E:}DISK OPERATING SYSTEM II VERSION 2.0SCOPYRIGHT 1980 ATARIA. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDGE J. D,}UPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRESSF. LOCK F-}ILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES9!&x#!7&p))'&X*./)L''-؆莟.}R'S  vW DEHHI 1A#! @ ~0ɛ8A0.) ȅ 1 1i/}il ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU! 0 .{z:*{}.|~ 1 0 00}JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # 0 0 n&|D! 1L NOT A DISK FILE1}N !B 1L " 1 !BDED:}:1BJ|DE 1DEBH2}I 1 h0ߢ 0.  0?詛 1 ~0YЛ 1 "L<" "L 3} BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWED COPYING---DN:4}# 0|D .L$A#B#C#JB|DE 1BHIDD#E 1D#0: B5} 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d# 𩛙d#X# 1,A#6}PdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt% e#dD#EL%7} 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C}//3Hu ξL/L DRIVE TO WRITE DOS FILES TO?WRITING NEW DOS FILESTYPE "Y" TO WRITE DOS TO DRIVE 1.?}D1:DOS.SYSERROR - NOT VERSION 2 FORMAT. , &* բ( 1L `[) 0NΞ 0 L1M) 1@} L BAD LOAD FILELOAD FROM WHAT FILE?) 0 0#B 1L WHAT FILE TO LOCK?) 0 0$B 1L WHAT FILE TO UNLOCK?DUA}P DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO USE PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV. h  ,B}  `)  <0 2 2 0  ,   ,,ޢ* 1L ,K* 1 ~0 0C}FINSERT BOTH DISKS, TYPE RETURNERROR - DRIVES INCOMPATIBLE., 1 ~038  , 1L D}, &*  Lz+, 0 , 1 ~0 + Y,0!,0 ,L+ ,mm  v,"ǭE}0Ξ, 05,Lt+L +,Hh` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNF}INSERT DESTINATION DISK,TYPE RETURN`    `L,8,0( rG}L1(`ߢ) 1* 1 ~0Y`hhL S SL1) 8`NAME OF FILE TO MOVE?- 0 0|DLtH}% A., 1 <0 0 .@L# .BJ 1  DEHIB V L1 ,5 1 <0,L. I} JB|,A#Pd#DE 1 HI BDEHHII 1 B 1 , 1 <0,0Lf- B VJ},A#P, 1 <0 0L#L ߢ) 1* 1 ~0Yj383}mm ݭK}}`8}``|* ? ɛ,`|:(|/ 1L `DESTINATION CANT L}BE DOS.SYS0 0H{ $22Δ $28/L /) $2 Π $2 0 ξM}hAΞB,0 J 1 BޝDEHI,HDE 1HIHIDELSAVE-N}GIVE FILE,START,END(,INIT,RUN)O X0 1`BDEPHI V` X0H 1 L O}0 0 1L0`PLEASE TYPE 1 LETTER,0`hhL <0 1L0LA1 ,;ɛ7,"ɛ:ݦ1ݥP}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{Q}NAME TOO LONG B VL ` L1I H1EӝDL1|mDiE` V0`8d/8 i:"2!22 1R} L ERROR- 128ɛ+,' 20*.. өw2 1``2TOO MANY DIGITSINVALIDS} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4uT} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4u8ytD1:SYSTEM.4TH $$(0,<HT`lx+7 CO[g  % V}W} D1:DISK.4THH# '+$/X}03 <8L4>űǕǕ LB<HǕha}˔ǕLB<(EMIT>gPEMI~>A>>@CKPRF̉>A>uA< *BKEٴ>P?TERMINA>P(CR>PC>Ab}<>A>@CMOV>> <LB<ƑL?U>!?”Ô666uuuLB@8@HHLB@-DUeDA6A<6A@TRAVERSuDAAA@<AA.D<AA@LATESԈDAQCuAuA@LFn}DA<C@CFDAfBC@NFDA<C(<<A@-TRAILINǝFA6AVBb=AA@^BCAwBC<@<^BC<@(."FAY@F6ACH@@6@F@.FA<"\CuA<EG{HCAs}CC< {HCFF@EXPECGAA@Ab=X6A<BuAC<A<~A{=CH@fBC@6@<'6A<At}@QUERGGABuA@ERASu} HAVBH@BLANK)HAwBH@HOL9HA(C<"BHCEAACv}6@Y@CA@CCH@>@UPPEtHAA@Ab={=AL@ERROIABuA@<ICFFG ? O?AACuACuAL@IDIAiH< <_H6ADDACy}iHA>iHF<?AA@^BC6AA<?AAFmD@CREATJACXuAC<@ DfB EI<AD J<OmDC6AABuAHMCC6AG9K\CuAo@<GOK<@ABORLAe FN>Gfig-FORTH 1.0DKKLCOL6LhLL D L L < LS->_LA6A@@@+LA@<@}@D+MA@<@@ABMA6AM@DAB%MA6AM@MI3MAAAKD<AA@MABMAAA.D<AA@MZMAAA?6@+MA+M?H@M}@MrMAA6@6@:MY@+MW?H@Y@?MAH@MA@MA?A@/MOĶMA6@LH@M@MAMAA@MOMAMA@*/MOMA6@wMH@M@*M}AMAA@M/MONA6@VBY@W?H@A6@W?H@@USN*B0PRE2N*B .+BU6A+CAGSCR # `S<VBb=>{=nBPSmD{=+CuAO<>@INDEtSA>CAb=>{=nBPSmDVB{=O><@<>>@}TRIAijSAnBMnBMnBA@Ab=>{={S<><O>>>@VLISSA<"CADCuAuA"CuABKD< >VB"CA6A JmDmDDDuA6Ao@>?<A}@PICTnT eѨLB6A<~CA@FREYYACXuAiH(<@C@UjYAVBAS@NEW-ABORԃYACfBC(<@L6AuACA@*$Y*B(P:Y}YP:PYBYPR-OYA(A@PR-OFYA(A@PLISYACA(< >>b=>{={S>>>><@<}(< >>@:SELECZAOFC^BCVBwB{HCCA(<;C<4CCBIACI< ADC<CFFG UNDEFINEDL<AA_F6A6AAnBM@CA}Cb={=A6Ao@<A{=CuA<@<AC< {=CuA<@nB+=@DUMJZAfCuA6@EVBb=>6A{=@6AVB(<SG:(<VBb=6A{=@AfBPSmD<}^B(<A(<VBb=6A{=@A><><@VB(<AA(<+=A>H@fCA@VB(<A@XI^}A(<lT6@Y@(@$STORŮ`A`HM6@}`CAY@>H@`@$VARLE`A^BCA@$VARMA`A}fBCA@$ aA6Aa`@$aA6A6Aa`A^BCA@$-aA}`C`F`@$DUFaA}`C``@$P2YaA}``@C@$LENlaAsaA@$OV}EaAsaCa`@$SWAЏaA}`6@`a`@C}`AY@A[H@c`A@$aAaa`@}`C6AC`[^Bc`EA}`A@$FILaAAC}`AC6Ac`AnB}lTAACYDYDH@$VARFILaAA6AaAaC|D<6@A#aH@Aaa2a<AA@$VARIABL bAOF6ACVBCC_FC@("YbAY@C#aY@AH@}@C6@@ybA\CuA<Eb(<"{HCACC<(<"{HCC#a@$EO̕bkFub$FILbAb#aa}`C@$SETDRbA~OXbA6Y(<`A}@$SETDRbA~OYbADY(<`A@$T c*B($COMPARE+cAVB1cA|D<8VBb=A{=@AA{=@AC|D<@< (<<^B1cA@<}AA1cuA@($BLCOMPARE5cAVB1cA|D<2VBb=6A{=@AwBC|D<@< (<<^B1cA@<A1cuA@$COMPARŐcAsaC}`C`aHMBc6A}o@<6`a.D<AsaC`@a`Cc<A}`Ca@`aCc@``@$cAco@@$DdAc@@"QdA(^BfAfBVB\+CuAnBPSGgG(<VBb=fB{=C\{=fBPSG |6A(< F(< @G|<A(<}(<\GgG(<(<\G|(<&(<\G|(<(<\GgGyf(< BHfB(<\G$EIT BORT OPY RASE EARCH VBf}A(<^B\@EDUgA[A^BC6Ao@<A(<[A@EDDOWhA[AC6A(<C<A^B[A@EDLEFiA \uA^BC6A(<C<A(<%} \A@EDRIGH>iA \uAC6A(<&C<A(< \A@EDINSLINiiA[A^BC6@Y@^BC(<b={=Hg{=CHg(< >{=Cug(<+=Y@Hg(< BHY}@ug(<H@C\wN@EDDELLINœiA[A^BC6@(<Y@b={=CHg{=Hg(< >{=ug(<@wBAAAug(<@ \AC[AwN@EDSCREEXkkFZh iGi}si~jjiidkj}jjjjjNjEDEXIԺkAA(<}>~O^B@EDABORkACNuAuA(<?CNuAAl@EDNEXlAAAA^B+CEAh(<}^BVB@EDPRE5lAAAA(<+CEAh(<^BVB@EDERASXlAAAAVBHgBBHyfBBH(<VBb={=ug(<~>^BC<`YVB6A(<0.DA(<9KD?<A`Y(<>VB< AACVB@EDGETN}U͹lA6A< iHAl<AiHVBo@< Xl<6AiHC< AVBVB<"VBAiHb=(< M{=A(<0C@<^B@EDNEDmAfB(<\Gscreen: }Om<+CAhAA(<^B<AfB(<\(<RVB@EDCOP٫mAA+CuAfB(<\Gfrom:VBOmAVBKD?<(< (<\Gto:VBOmAVBKD?<}(<(<\Gscreens:VBOmAVBKD?<~nBlTnBlTKD<*VBb=A{=@OA{=@7CuA@NB>wN<<>6@Y@@^BCAY@@^BCAH@VBb=A{=}COA{=C7CuA@NB>wN<AA~O<AAA<AA<A+CAhVB@EDSEARCmAAVB@EDMENUSEokFZXlAlCmElSo>>luAVB>A FVB\A+CAhVB(<}W>6A(<C<^BfAkAVBfA<AKo<>A@ADDBLKӖoAA~O<Y[(< VBDY<X[(< VB6Y9VT^BN6A(<BHAVBb=[A}(<oWT<A[oVN@DOoBDIOpA[oV[(<VBb9V`>T[iH(< W|D<TiHAF<[oVT@LOCYpA[oV(<#[VBVBb'^}`T@UNLOC˛pA[oV(<$[VBVBb'^`T@DELETżpA[oV(rH ShLB>Gsector 6A`S6@fB(}<H@rGstatus=`S>(<(<Z>@BUsBCOPJsA>GPut SOURCE in drive 1>GPut DEST. in drive 2>GHit key when re}ady>A>(<^Bb={=`SG R=^BPs{=r`SG W=fBPs{=r`S><GDONE`Y>@STsAcN@DOS.FILsA[(<VBb9V[oV@CREATE.F}ILsAts^BAo`@S1EDItAs^Bo@RN6tA(< ҊA@SETUItAb D1:SYSTEM.4THbN@<[g  % _( basic functions ) HEX : BELL FD EMIT ; DECIMAL : FREE ( amount of memory lef }t) MEMTOP @ PAD 256 + - ; : U. 0 D. ; ( unsigned . ) : NEW-ABORT ( auto-reset ) HERE 2 - ' ABORT DUP @ , }! ; IMMEDIATE 512 VARIABLE *$* ( $STK size) } --> } ( printer routines ) HEX CREATE (P:) 50 C, 3A C, 9B C, SMUDGE ' (P:) CONSTANT P: : PR-ON 70 CLOSE }70 8 0 P: OPEN 1 PRFLAG ! ; : PR-OFF 70 CLOSE 0 PRFLAG ! ; : PLIST ( strt end --> ) 1+ SWAP C EMI }T ( form-feed) CR DO CR I LIST CR CR CR ?TERMINAL IF LEAVE ENDIF LOOP C EMIT CR ; } } -->HEX : :SELECT ( code --> ? ) DUP DUP C@ 3 * + 1+ SWAP 1+ DO I C@ DUP 0= IF DROP } I 1+ @ EXECUTE LEAVE ELSE OVER = IF I 1+ @ EXECUTE LEAVE ENDIF ENDIF 3 +LOOP ; } 6 LOAD( ERROR MESSAGES ) EMPTY STACK DICTIONARY FULL } HAS INCORRECT ADDRESS MODE ISN'T UNIQUE DISK RANGE ? } FULL STACK DISK ERROR ! } } FORTH INTEREST GROUP ( ERROR MESSAGES ) COMPILATION ONLY, USE IN DEFN EXECUTION ONL }Y CONDITIONALS NOT PAIRED DEFINITION NOT FINISHED IN PROTECTED DICTIONARY USE ONLY W }HEN LOADING OFF CURRENT EDITING SCREEN DECLARE VOCABULARY } } : DUMP ( from number --> ) BASE @ >R HEX ( save base) }0 DO CR DUP I + DUP 0 4 D.R ." :" 8 0 DO ( 8 byte values) DUP I + C@ 2 .R SPACE LOOP 1 2FE C! ( display controls) } 8 0 DO ( print ASCII) DUP I + C@ EMIT LOOP ?TERMINAL IF LEAVE ENDIF 0 2FE C! DROP 8 +LOOP } DROP CR R> BASE ! ; : ,hi-lo) -DUP IF 1 - -1 SWAP DO OVER I + C@ OVER I + C }! -1 +LOOP ENDIF DROP DROP ; -->( I/O definitions ) 00 CONSTANT #0 30 C }ONSTANT #3 40 CONSTANT #4 50 CONSTANT #5 60 CONSTANT #6 2FB CONSTANT ATACHR 54 CONSTANT ROWCRS } ( 1 byte) 55 CONSTANT COLCRS ( 2 bytes) } } 0 VARIABLE (COLOR) -->: ?IOERR (STAT) @ 7F > IF BASE @ H }EX HERE COUNT TYPE ." ? I/O ERROR " (STAT) @ . BASE ! SP! IN @ BLK @ QUIT ENDIF ; CREATE } (S:) 53 C, 3A C, 9B C, SMUDGE ' (S:) CONSTANT S: CREATE (E:) 45 C, 3A C, 9B C, SMUDGE ' (E:) CONSTANT E: : G }R. ( mode --> ) ( mode+16=split,mode+32=no clr) #6 CLOSE #0 CLOSE #0 C 0 E: OPEN } #6 SWAP DUP 30 AND C OR ( aux1) SWAP S: OPEN ?IOERR ; -->: POS. ( x y --> ) } ROWCRS C! COLCRS ! ; : COLOR ( col --> ) (COLOR) C! ; : DR. ( x y --> ) } (COLOR) C@ ATACHR C! POS. #6 11 JSRCIO ; : LOC. ( x y --> val ) OVER OVER POS. #6 GET } >R POS. #6 R PUT R> ; : PL. ( x y --> ) POS. #6 (COLOR) C@ PUT ; : SE. ( reg hue lum }--> ) SWAP 10 * + SWAP 2C4 + C! ; : STICK ( port --> value) 278 ( STICK0) + C@ ; -->CREATE (CVTSTK) 4 } C, 2 C, 3 C, FF C, 6 C, 8 C, 7 C, FF C, 5 C, 1 C, 0 C, SMUDGE : CVTSTK ( value --> 0=nothing, 1=up, 3=right }, 5=down, 7=left) 5 - ' (CVTSTK) + C@ ; : STRIG ( port --> TF,T=not psh) 284 ( STRIG0) + C@ ; : SO. ( voi }ce pitch dist vol ->) 3 D20F C! 3 232 C! 0 D208 C! SWAP 10 * + 3 PICK DUP + D201 ( AUDC1) + C! SWAP DU }P + D200 ( AUDF1) + C! ; -->: SPE }MIT ( char -->,special ch) 1 2FE C! EMIT 0 2FE C! ; : XIO ( cmd iocb aux1 aux2 nameaddr --> ) 4 } PICK >R ( iocb --> ret stk) R 344 + ! ( store name addr) R 34B + C! ( store aux2) R> 34A + C! ( store aux1) } SWAP JSRCIO ( do cmd) ; } DECIMAL } -->( string definitions) HEX *$* @ ALLOT ( allocate $STK) HERE CONSTANT $0 ( $STK base) $0 VARIABLE $P ( $STK }pointer) : $P! ( --> , reset $STK) $0 $P ! ; : $P@ ( --> $P value) $P @ ; } : $DROP ( $ -$> ) $P@ DUP C@ + 1+ $P ! ; : $LEN ( --> len of top $ ) $P@ C@ ; } : $FETCH ( addr len --> , -$> $) $P@ OVER 1+ - DUP $P ! ( upd$P) OVER OVER C! ( store len) 1+ SWAP CMOV }E ( move str) ; -->: $STORE ( addr max --> actual, $ -$> ) $LEN MIN >R ( actual length) $P@ 1+ SW }AP R CMOVE R> $DROP ; : $VARLEN ( vaddr --> len ) 1 - C@ ; : $VARM }AX ( vaddr --> max len ) 2 - C@ ; : $@ ( vaddr -->, -$> $ ) DUP $VARLEN $FETCH ; : $! } ( vaddr -->, $ -$> ) DUP DUP $VARMAX $STORE SWAP 1 - C! ; : $. ( $ -$> , print string) }$P@ 1+ $LEN TYPE $DROP ; -->: $DUP ( $ -$> $ $ ) $P@ 1+ $LEN $FETCH ; : $P2@ ( 2nd$P) $P@ $LEN + 1+ }; : $LEN2 ( 2ndlen) $P2@ C@ ; : $OVER ( $1 $2 -$> $1 $2 $1 ) $P2@ 1+ $LEN2 $FETCH ; : $SWAP ( $1 $2 -$> $2 $1 ) } $P@ >R $LEN ( $2 length) $OVER $LEN + 2+ ( $1$2$1, len) $P@ SWAP R SWAP $P ! ; ( pop extra $ }1) : $+ ( $1 $2 -$> $1+$2 ) $SWAP $LEN2 $LEN + $P@ 1+ DUP 1+ $LEN : $FILL ( n b -->, -$> n b's ) OVER 1+ $P@ SWAP - DUP $P ! ( alloc space ) } 3 PICK OVER C! ( store length) 1+ ROT ROT FILL ; : $VARFILL ( vaddr b --> ) OVER DUP $VARM }AX SWAP $VARLEN - -DUP IF ( any left to fill?) >R OVER $@ R> SWAP $FILL $+ $! ELSE DROP D }ROP ENDIF ; : $VARIABLE ( len -->) 2+ ; : (") ( m }ove inline str to $STK) R 1+ $@ R C@ R> + 1+ >R ; -->: " ( if comp, put inline str on $STK in exec, else put now) STATE } @ IF COMPILE (") 22 WORD HERE C@ 1+ ALLOT ELSE 22 WORD HERE 1+ $@ ENDIF ; IMMEDIATE 1 $ }VARIABLE $EOL ( EOL string) $EOL 9B $VARFILL : $FILE ( --> addr, $ -$> $+EOL) $EOL $@ $+ $P@ 1+ ; }: $SETDR0 ( --> , $ -$> ) FLUSH CLOSE-DR0 $FILE DROP DR0NAME 10 $STORE DROP ; : $SETDR1 ( --> , $ -$> ) } FLUSH CLOSE-DR1 $FILE DROP DR1NAME 10 $STORE DROP ; -->0 VARIABLE $TR ( temp result) : ($COMPARE) ( addr1 addr2 } len --> 1,0,-1 ) 0 $TR ! -DUP IF ( len>0?) 0 DO OVER I + C@ OVER I + C@ - -DUP IF ( no match }?) 0< IF -1 ELSE 1 ENDIF $TR ! LEAVE ENDIF LOOP ENDIF DROP DROP $TR @ ; : ($BLCOMPARE) ( add }r len --> 1,0,-1 compare to blanks) 0 $TR ! -DUP IF ( len>0?) 0 DO DUP I + C@ BL - -DUP IF 0< IF -1 ELSE }1 ENDIF $TR ! LEAVE ENDIF LOOP ENDIF DROP $TR @ ; -->: $COMPARE ( --> 1,0,-1 $1 $2 -$> , }compare two str) $P2@ 1+ $P@ 1+ $LEN $LEN2 MIN ($COMPARE) DUP 0= ( match?) IF ( ck rest of str) $LEN $LEN }2 < IF ( $1 longer?) DROP $P2@ 1+ $LEN + $LEN2 $LEN - ($BLCOMPARE) ELSE DROP $P@ 1+ $LEN2 + $LEN $LEN2 } - ($BLCOMPARE) MINUS ENDIF ENDIF $DROP $DROP ; : $= ( --> tf, $1 $2 -$> ) $COMPARE 0= ; : $< }( --> tf, $1 $2 -$> ) $COMPARE 0< ; DECIMAL -->: "" ( push empty str on $STK) - }1 $P +! 0 $P@ C! ; 0 VARIABLE $TO ( offset) 0 VARIABLE $TL ( length) : $EXTRACT ( varaddr off char } --> t offset -$> word --> f [when no word left] ) $TR ! ( store char) -1 $TO ! 0 $TL ! ( clr off, }len) OVER $VARLEN OVER OVER < IF ( still room left in var) SWAP DO ( find 1st non-separ) DUP I + C@ $TR @ = 0= } IF ( non-separator char) I $TO ! ( starting offset) --> I 1+ OVER $VARLEN }OVER OVER < IF ( not at end of var) SWAP DO ( find next separ) DUP I + C@ $TR @ = IF ( found en }d of word) I $TO @ - $TL ! ( length) LEAVE ENDIF LOOP $TL @ 0= IF ( assume } end of line) DUP $VARLEN $TO @ - $TL ! ( length to end) ENDIF ELSE ( 1 !}char at end of var) 1 $TL ! DROP DROP ENDIF LEAVE --> ENDIF "} LOOP ELSE DROP DROP ENDIF $TO @ #}0< IF ( word not found) DROP 0 ( return FALSE) ELSE ( word was found) $TO @ + $TL @ $FETCH ( get wd) $T $}O @ $TL @ + ( new offset) 1 ( return TRUE) ENDIF ; %} - &}->: $+! ( var --> , $ -$>, add str to variable ) ( comp. new len) >R R $VARLEN R + ( start addr) R $VARMAX R $VARLEN - ( ch '} lft) $STORE ( concat, ret len added) R $VARLEN + R> 1 - C! ( store new length) ; : $RESET ( auto-$STK res (}et) NEW-ABORT $P! DECIMAL ; )} *} -->: $LOAD ( filename -$> ) $SETDR1 DR1 1 LOAD ; : LOAD-ED " D:EDITOR.4TH +}" $LOAD ; : LOAD-BED ( boot editor) " D:BOOTEDIT.4TH" $LOAD ; : LOAD-DOS " D:DOS.4TH ,}" $LOAD ; : LOAD-TURN " D:TURNKEY.4TH" $LOAD ; -} .} /} 0} 1} 2} BELL FD EMIT ; DECIMAL : FREE ( amount of memory lef &( Set up noisemaker words ) : TASK ; 4} : SOUND ( pit chan# --> ) SWAP 10 10 SO. ; 5} : SOUND0 ( pit --> pit chan0 ) 0 SOUND ; : SOUND1 ( pit --> pit6} chan1 ) 1 SOUND ; 7} -->( More noisemaker words ) : LOWER.PITCH ( pit --> pit ) SOUND0 ; 8} : RAISE.PITCH ( pit --> pit ) 255 SWAP - SOUND1 ; 9} : BEATS ( n --> ) 50 * 0 DO LOOP ; : OFF ( ch:}an# --> ) 0 0 0 SO. ; ;} -->( Create chirp routine ) : CHIRP 50 <}0 DO I LOWER.PITCH LOOP 0 OFF ; HE=}X : 0 n ) D20A C@ 7 /MOD DROP DUP 0= IF 7 + ENDIF ; DECIMAL>} : CHIRPS 0( Create siren routine ) : SIREN @} 180 100 DO I LOWER.PITCH 2 BEATS LOOP A} 0 OFF ; B} C} -->( Create crossover sounds ) : CROSS D} 250 50 DO I RAISE.PITCH I LOWERE}.PITCH LOOP 0 OFF 1 OFF ; F} G} -->( Helper words for menus ) HH}EX : ? ( --> 0/1 ) D01F C@ 6 = ; I} : CURSOR.OFF 1 2F0 C! ; J} DECIMAL K} -->( More helper words for menus ) L} : CLEAN.SCREEN 0 GR. ." ok" QUIT ; : WAIT M} 80 BEATS ; : SET.SCREEN ( col row --> ) 0 GR. N} 2 0 4 SE. 4 0 8 SE. POS. CURSOR.OFF ; O} -->( Make noises consecutively ) P} : NOISES 10 10 SET.SCREEN ." Hold to exit" BEGQ}IN SIREN WAIT CHIRPS R} WAIT CROSS WAIT ? UNTIL ; S} -->( Helper word for main menu T} ) : ENTER.CHOICE ( n --> m ) KEY DUP EMIT 48 - ; U} V} W} -->( Select noise frX}om menu input ) : TEST.CHOICE ( m --> ) DUP 1 = IF SIREN ELSE DUP 2 = IF Y}CHIRPS ELSE DUP 3 = IF CROSS ELSE DUP 4 = IF NOISES ELSE DUP 0 = IF DROP Z} CLEAN.SCREEN QUIT ENDIF ENDIF [} ENDIF ENDIF ENDIF DROP ; -->( Mai\}n menu ) : MENU BEGIN ]} 9 5 SET.SCREEN ." ̦РҠ" 15 7 POS. ." 1 SIREN" 15 8 POS. ." 2 CHIRPS" ^} 15 9 POS. ." 3 CROSS" 15 10 POS. ." 4 NOISES" 15 11 POS. ." 0 QUIT" 12 14 POS. ." Enter choic_}e: " ENTER.CHOICE TEST.CHOICE AGAIN ; MENU `} a} b} c} d} e} f} g} q}B'DOS SYSB*+DUP SYSB{UAUTORUN SYSBcSYSTEM 4THBR3NOISES 4THBRFLAKES 4THB%FLAKES BAS r} s} t} u} v} w} x} y} z} {} |} }} ~} } } } } } } } } } } } } } } } s( Create sine/cosine tables ) : TASK ; } : ARRAY SWAP 2 * + ; } 6 ARRAY SINE 6 ARRAY COSINE } } -->0 0 SINE ! 866 1 SINE ! 866 2 SINE ! 0 3 SINE ! } -866 4 SINE ! -866 5 SINE ! 1000 0 COSINE} ! 500 1 COSINE ! -500 2 COSINE ! -1000 3 COSINE ! -500 4 COS}INE ! 500 5 COSINE ! } -->( Page flip constants ) 0 CONSTANT RAMTOP1 0 CONSTANT RAMTOP2 } 0 CONSTANT DL1+5 0 CONSTANT DL1+101 0 CONSTANT DL2+5 0 }CONSTANT DL2+101 0 CONSTANT D1TOP 0 CONSTANT D1BOT } 0 CONSTANT D2TOP 0 CONSTANT D2BOT 0 CONSTANT PLOT1 } 0 CONSTANT PLOT2 -->( Misc parameters ) 10 ARRAY X } 10 ARRAY Y 160 CONSTANT ORIGIN.X 96 CONSTANT ORIGIN.Y } 0 CONSTANT THETA } } -->( snowflake algorithm ) : RANDOMIZE.D}ENDRITE.SHAPE 10 0 DO 24 RND * 256 / I X ! } I RND * 128 / I Y ! LOOP ; } } -->: FIRST.DENDRITE 10 0 } DO ( Compute x offset ) I X @ THETA COSINE @ * I Y @ THETA SINE @ * } + 400 / ORIGIN.X + ( Compute y offset ) I X @ THETA SINE @ * MINUS I Y @ THETA COSINE @ * } + 400 / ORIGIN.Y + DR. ( drawto ) LOOP ; } -->: ROTATE.FIRST.DENDRITE 6 0 } DO ORIGIN.X ORIGIN.Y PL. I ' THETA ! FIRST.DENDRITE } LOOP ; } } -->: SECOND.DENDRITE 10 0 } DO ( Compute x offset ) I X @ THETA COSINE @ * I Y} @ THETA SINE @ * - 400 / ORIGIN.X + ( Compute y offset ) I X @ THETA SINE @ * MINUS }I Y @ THETA COSINE @ * - 400 / ORIGIN.Y + DR. ( drawto ) LOOP ; } -->: ROTATE.SECOND.DENDRITE } 6 0 DO ORIGIN.X ORIGIN.Y PL. I ' THETA ! } SECOND.DENDRITE LOOP ; } : START.SCREEN 24 GR. 2 0 0 SE. ( setcolor ) 1 COLOR ; } -->: DRAW.FLAKE } RANDOMIZE.DENDRITE.SHAPE ROTATE.FIRST.DENDRITE ROTATE.SECOND.DENDRITE ; } : CLEAR.CHAR 255 764 C! ; : LEAVE? ( hit any key to quit) 255 764 C}@ = 0= ; : CLEANUP 0 GR. ." ok" QUIT ; } -->( Dra}w flakes on screen ) : SECS 10000 * 0 DO LOOP ; : }FLAKES CLEAR.CHAR BEGIN START.SCREEN } DRAW.FLAKE 3 SECS LEAVE? UNTIL } START.SCREEN CLEANUP ; } -->( Set up page flip routine ) : CLEAR.DISPLAYS ( clear display area} 2 ) RAMTOP2 106 C! START.SCREEN ( clear display area 1 ) RAMTOP1 106 C! } START.SCREEN ; : INITIALIZE.MEMORY START.SCREEN } ( store RAMTOP 1, 2 ) 106 C@ ' RAMTOP1 C! RAMTOP1 32 - ' RAMTOP2 C! CLEAR.DISPL}AYS ; -->: STORE.POINTERS ( store DL 1, 2 display byte ) 560 @ 5 + ' DL1+5 ! DL1+5 96} + ' DL1+101 ! DL1+5 8192 - ' DL2+5 ! DL1+101 8192 - ' DL2+101 ! ( store display pointer 1, 2 ) DL1+5} C@ ' D1TOP C! DL1+101 C@ ' D1BOT C! DL2+5 C@ ' D2TOP C! DL2+101 C@ ' D2BOT C! ( }store plot pointer 1, 2 ) 89 C@ ' PLOT1 C! PLOT1 32 - ' PLOT2 C! ; } -->: PLOT2.DISPLAY1 ( plot in area 2 ) PLOT2 89 C! } DRAW.FLAKE ( clear area 1 ) RAMTOP1 106 C! START.SCREEN } ( display area 2 using DL1 ) D2TOP DL1+5 C! D2BOT DL1+101 C! ; } } -->: PLOT1.DISPLAY2 ( plot in area 1 ) PLOT1 89 C! } DRAW.FLAKE ( clear area 2 ) RAMTOP2 106 C! START.SCREEN } ( display area 1 using DL2 ) D1TOP DL2+5 C! D1BOT DL2+101 C! ; } } -->( display flake; plot offscreen) : FLIP}.FLAKES CLEAR.CHAR INITIALIZE.MEMORY STORE.POINTERS }BEGIN PLOT2.DISPLAY1 PLOT1.DISPLAY2 0 77 C! ( prevent attract ) } LEAVE? UNTIL CLEAR.DISPLAYS CLEANUP ; } -->( set up menu ) } : CRS 0 DO CR LOOP ; : MENU 0 GR. 2 0 0 SE. 1 75}2 C! 8 CRS 6 SPACES ." Linus & Phineas present" 2 CRS 12 SPACES ." FLAKES.4TH" } 3 CRS 4 SPACES ." Enter FLAKES or " ." FLIP.FLAKES" 4 CRS QUIT ; } MENU } } } } } } } } } } } } s } s}~vISTRINGXSCREELOCHACHARLOBYTSINECOSINEXYDL1PDL1P10DL2PDL2P10D1TOD1BOD2TOD2BOPLOTPLOTR}AMTOPRAMTOPA A B1Bc7@&A Bx @A A A A # }@`?PB('B)#BF5BG1A)AD@A@A)@A`A}(JJ*** TITLE SCREEN ***************************************************;A@,;@, +}@$@ ""A A0$%%6-F:@,%AV$F:@,.6-%$@@%8-@}B:,B6.7<,L 6-@:,V1!@2* @e'6-&@21 A``#"@2 A`# Aj!A}'6-&A(t'!@1* @'6-&@2~ @26-%@d6-BsD%$@-}@%$@@F:%, 6-%@  A@70@@70@}A-A@+,A=/A`@A %-A % A -6-BsD%}$@--@%$@@ 6-%@$ ##8,8,$$8,16,} Linus and Phineas $$8,24, present ($$8,32, 2$$8,40, FLAKES.BAS } <$$8,48, F$$8,56, from P$$8,64, SNOWDEMO - ANALOG #11 Z$$8,72}, Hit Any Key to Exit d$$8,80,n999,999,999II*** PAGE FLIP ROUTINE ******}***************************************55SET UP ARRAYS FOR SNOWFLAKE PLOTTING SUBROUTINE 119@,9@},9@,9@,3-@@"&68,-/68,-3  ::0,1,0.866,0.5,0.866,-0.5,0,-1,-0.866,-0.}5,-0.866,0.5*AdAU4>SET UP DISPLAY LISTSHR 6-F:A, 6-&@2\=A+@$}30@=@fGA+@$30@=@G A0pz""STO}RE DISPLAY LIST ADDRESSES--6-F:A`,%F:Aa,$AV%@6-%@6-&A6-&A}..STORE CONTENTS OF DISPLAY LIST ADDRESSES 6-F:, 6-F:, 6-F:, 6-F:, STORE} PLOT POINTERS  -F:@,$ -&@2. 8 ((PLOT IN SCREEN 2; DISPLAY SCREEN 1B L @V } A0` Aj 1 +@$'0@1@t ~  "F:Ad,AU" A%}  ((PLOT IN SCREEN 1; DISPLAY SCREEN 2  @ A0 A 1 +@$'0@}1@   "F:Ad,AU" A% A#  33CLEAR MEMORY; RESTORE POINTE}RS; LEAVE PROGRAM  2A+@$%A/+@$2   II*** SNOWFLAKE PLOTTING SUBROUTINE }*********************************  c-@@168,-H:,$@M68,-H:,$@$Q c@}w =-@@),A`@=-@@ JB/A`%+8,$8,%8,$8,,@%+68,$}8,%8,$8,,F J  =-@@),A`@=-@@ JB/A`%+8,$8,&8,$8,,@}%+68,$8,&8,$8,,F J  $ D:FLAKES.BAS,9@,9@,9@,3-@@"&}68,-/68,-3 ::0,1,0.866,0.5,0.866,-0.5,0,-1,-0.866,-0.5,-0.866,0.5 --6-F:A`,%F:Aa,$AV%@}6-%@ 6-&A*6-&A4> 6-H 6-R 6-\ 6-fp-F:@,z}-&@26-F:A,6-&@2@ A0A1 +@$'0@}1@  @ A0 A 1 +@$'0@}1@ $ . A"  : D RANDOMIZE SHAPEN X c-@@168,-H:},$@M68,-H:,$@$Q c@wb l ECHO AND ROTATE SHAPEv  -@@} ),A`@)-@@ JB/A`%+8,$8,%8,$8,,@%+68,$8,%8,$8,,F J   }-@@ ),A`@)-@@ JB/A`%+8,$8,&8,$8,,@%+68,$8,&8,$8,,}F J  $ D:FLAKES.BASHACHARLOBYTSINECOSINEXYDL1PDL1P10DL2PDL2P10D1TOD1BOD2TOD2BOPLOTPLOTR#